package com.ruoyi.material.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

import com.ruoyi.common.core.domain.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.material.mapper.MateriaTypeMapper;
import com.ruoyi.material.domain.MateriaType;
import com.ruoyi.material.service.IMateriaTypeService;

/**
 * 材料类型Service业务层处理
 * 
 * @author renyuxin
 * @date 2024-05-29
 */
@Service
public class MateriaTypeServiceImpl implements IMateriaTypeService 
{
    @Autowired
    private MateriaTypeMapper materiaTypeMapper;



    /**
     * 查询材料类型
     * 
     * @param materiatypeId 材料类型主键
     * @return 材料类型
     */
    @Override
    public MateriaType selectMateriaTypeByMateriatypeId(Long materiatypeId)
    {
        return materiaTypeMapper.selectMateriaTypeByMateriatypeId(materiatypeId);
    }

    /**
     * 查询材料类型列表
     * 
     * @param materiaType 材料类型
     * @return 材料类型
     */
    @Override
    public List<MateriaType> selectMateriaTypeList(MateriaType materiaType)
    {
        return materiaTypeMapper.selectMateriaTypeList(materiaType);
    }

    /**
     * 新增材料类型
     * 
     * @param materiaType 材料类型
     * @return 结果
     */
    @Override
    public int insertMateriaType(MateriaType materiaType)
    {
        return materiaTypeMapper.insertMateriaType(materiaType);
    }

    /**
     * 修改材料类型
     * 
     * @param materiaType 材料类型
     * @return 结果
     */
    @Override
    public int updateMateriaType(MateriaType materiaType)
    {
        return materiaTypeMapper.updateMateriaType(materiaType);
    }

    /**
     * 批量删除材料类型
     * 
     * @param materiatypeIds 需要删除的材料类型主键
     * @return 结果
     */
    @Override
    public AjaxResult deleteMateriaTypeByMateriatypeIds(Long[] materiatypeIds)
    {
        for(Long materiatypeId:materiatypeIds){
            if(materiaTypeMapper.hasdata(materiatypeId)!=null){
                return AjaxResult.error("先删除材料表关联信息,再进行操作！");
            }
            materiaTypeMapper.deleteMateriaTypeByMateriatypeIds(materiatypeIds);
        }
        return AjaxResult.success();
    }

    /**
     * 删除材料类型信息
     * 
     * @param materiatypeId 材料类型主键
     * @return 结果
     */
    @Override
    public int deleteMateriaTypeByMateriatypeId(Long materiatypeId)
    {
        return materiaTypeMapper.deleteMateriaTypeByMateriatypeId(materiatypeId);
    }

    @Override
    public MateriaType getTree() {
        List<MateriaType> list = materiaTypeMapper.selectMateriaTypeList(new MateriaType());
        MateriaType root  = new MateriaType();
        root.setMateriatypeId(0L);
        root.setMateriatypeName("根节点");
        root.setLevel(0L);

        findChild(root,list);
        return root;
    }


    private void findChild(MateriaType root, List<MateriaType> list) {
        List<MateriaType> children = list.stream()
                .filter(materialType -> materialType.getMateriatypePid().equals(root.getMateriatypeId()))
                .peek(m -> findChild(m, list))
                .collect(Collectors.toList());

        root.setChildren(children);

    }

    /**
     * 有子节点 则不能删除
     */
    @Override
    public boolean hasChildren(Long materiatypeId) {

        Long id = materiaTypeMapper.hasChildren(materiatypeId);
        return id!=null;
    }
    /**
     * 名称的唯一性验证
     */
    @Override
    public boolean checkNameUnique(MateriaType materiaType) {
        Long id= materiaTypeMapper.checkNameUnique(materiaType);
        return id!=null;
    }

}
